package package03章_流程控制语句;

/*
题目：找出100以内所有的素数（质数）？100000以内的呢？

质数：只能被1和它本身整除的自然数。比如：2,3,5,7,11,13,17,19,23,....

   ---> 换句话说，从2开始到这个自然数-1为止，不存在此自然数的约数。


*/
public class c_3_12PrimeNumberTest {
    public static void main(String[] args) {
        // 方式1：
/*        for (int i = 2; i <= 100; i++) {
            int number = 0; //记录i的约数的个数（从2开始，到i-1为止）
            //判定i是否是质数
            for (int j = 2; j < i; j++) {

                if (i % j == 0) {
                    number++;
                }

            }
            if (number == 0) {
                System.out.println(i);
            }
        }*/


        //方式2：
        // 获取当前系统的时间
      /*  long start = System.currentTimeMillis();
        boolean isFlag = true;
        int count = 0;//记录质数的个数
        for (int i = 2; i <= 100000; i++) { //遍历100以内的自然数
            //判定i是否是质数
            for (int j = 2; j < i; j++) {
                if (i % j == 0) {
                    isFlag = false;
                }
            }

            if (isFlag) {//if(isFlag == true){
                System.out.println(i);
                count++;
            }

            //重置isFlag
            isFlag = true;
        }
        long end = System.currentTimeMillis();
        System.out.println("质数的总个数为：" + count); //9592
        System.out.println("花费的时间为：" + (end - start)); //17914*/


        c_3_12PrimeNumberTest.PrimeNumberTest2();
    }
    /*
遍历100000以内的所有的质数。体会不同的算法实现，其性能的差别

此PrimeNumberTest2.java是方式2，针对于PrimeNumberTest1.java中算法的优化
*/

    static void PrimeNumberTest2() {

        //获取系统当前的时间：
        long start = System.currentTimeMillis();

        boolean isFlag = true;

        int count = 0;//记录质数的个数

        for (int i = 2; i <= 100000; i++) { //遍历100000以内的自然数


            //判定i是否是质数
            for (int j = 2; j <= Math.sqrt(i); j++) {

                if (i % j == 0) {
                    isFlag = false;
                    break;//针对于非质数有效果。
                }

            }

            if (isFlag) {
                count++;
            }

            //重置isFlag
            isFlag = true;
        }
        //获取系统当前的时间：
        long end = System.currentTimeMillis();

        System.out.println("质数的总个数为：" + count); //9592
        System.out.println("花费的时间为：" + (end - start)); //7209 -->加上break:659 -->加上Math.sqrt():6
    }


}
